#include "myrpcconf.h"
#include <memory>

void MyRPCConfig::loadConfigFile(const char* filepath) {
    // 定义缓冲区大小
    const int BUFFER = 1024;
    // 使用一个unique_ptr来管理文件指针
    std::unique_ptr<FILE,decltype(&fclose)> pt(fopen(filepath,"r"),&fclose);
    if (pt == nullptr) {
        exit(EXIT_FAILURE);
    }
    // 定义一个缓冲区
    char buf[BUFFER];
    while(fgets(buf,BUFFER,pt.get())) {
        // 按行读取数据
        std::string read_buf(buf);
        // 去掉前导和后导空格
        trim(read_buf);
        if (read_buf[0] == '#' || read_buf.empty()) {
            continue;
        }
        // 寻找'='所在的位置
        int index = read_buf.find('=');
        if (index == -1) {
            // 说明当前读取的行里面没有=
            continue;
        }
        // 获取key，从0索引开始，切index的长度
        std::string key = read_buf.substr(0,index);
        trim(key);
        // 从index索引开始往后找，找到\n对应的索引
        int endindex = read_buf.find('\n',index);
        std::string value = read_buf.substr(index + 1,endindex - index - 1);
        trim(value);
        config_map.insert({key,value});
    }
}

std::string MyRPCConfig::load(const std::string& key) {
    auto iter = config_map.find(key);
    if (iter != config_map.end()) {
        return iter->second;
    } 
    return "";
}

void MyRPCConfig::trim(std::string& read_buf) {
    // 从前往后找到第一个非空格字符的索引
    int index = read_buf.find_first_not_of(' ');
    if (index != -1) {
        read_buf = read_buf.substr(index,read_buf.size() - index);
    }
    // 从后往前找到第一个非空格字符的索引
    index = read_buf.find_last_not_of(' ');
    if (index != -1) {
        read_buf = read_buf.substr(0,index + 1);
    }
}